/*
 * To change this template, choose Tools | Templates
 * and open the template in the editor.
 */
package com.ec.medical.servicio.impl;

import com.ec.medical.entidades.DivisionGeografica;
import com.ec.medical.servicio.DivisionGeograficaServicioLocal;
import java.util.List;
import javax.ejb.Stateless;
import javax.ejb.TransactionAttribute;
import javax.ejb.TransactionAttributeType;
import javax.persistence.Query;

/**
 *
 * @author Administrador
 */
@Stateless
public class DivisionGeograficaServicioImpl extends ServicioBase<DivisionGeografica> implements DivisionGeograficaServicioLocal {

    public DivisionGeograficaServicioImpl() {
        super(DivisionGeografica.class);
    }

    /**
     *
     * @param divisionGeografica
     * @return
     */
    public DivisionGeografica obtenerDivisionGeograficaPadre(DivisionGeografica divisionGeografica) {

        String jpql = " SELECT dg.divisionGeograficaPadre FROM DivisionGeografica dg WHERE 1=1 ";
        jpql += " AND dg.codigoDivisionGeografica = :codigoDivisionGeografica ";
        Query query = em.createQuery(jpql);
        query.setParameter("codigoDivisionGeografica", divisionGeografica.getCodigoDivisionGeografica());

        DivisionGeografica divGeograficaPadre = (DivisionGeografica) query.getSingleResult();

        if (divGeograficaPadre.getNivel() == 0) {
            return divGeograficaPadre;
        } else {
            return obtenerDivisionGeograficaPadre(divGeograficaPadre);
        }
    }

    /**
     * Recupera las divisiones geograficas dado el codigo de la division padre
     *
     * @param codigoDivisionGeograficaPadre
     * @return
     */
    @TransactionAttribute(TransactionAttributeType.NOT_SUPPORTED)
    public List<DivisionGeografica> obtenerPorPadre(Integer codigoDivisionGeograficaPadre) {

        String jpql = " SELECT dg FROM DivisionGeografica dg WHERE 1=1 ";

        if (codigoDivisionGeograficaPadre != null) {
            jpql += " AND dg.divisionGeograficaPadre.codigoDivisionGeografica = :codigoDivisionGeograficaPadre ";
        } else {
            jpql += " AND dg.divisionGeograficaPadre IS NULL";
        }

        Query query = em.createQuery(jpql);
        if (codigoDivisionGeograficaPadre != null) {
            query.setParameter("codigoDivisionGeograficaPadre", codigoDivisionGeograficaPadre);
        }
        return query.getResultList();
    }

    /**
     * Recupera la divisionGeografica por su codigo
     *
     * @param divisionGeografica
     * @return
     */
    public DivisionGeografica obtenerPorCodigo(DivisionGeografica divisionGeografica) {
        Query query = em.createNamedQuery("DivisionGeografica.findByCodigoDivisionGeografica");
        query.setParameter("codigoDivisionGeografica", divisionGeografica.getCodigoDivisionGeografica());
        return (DivisionGeografica) query.getSingleResult();
    }
}
